Kubernetes 共享 GPU 调度指南
本篇博文介绍了如何在 Kubernetes 集群中使用 GPU 资源,以及如何设置共享 Nvidia GPU 的详细步骤。
依照本文操作你将完成如下内容:
- Nvidia 和 CUDA 驱动安装
- Nvidia Container Runtime 的配置
- Kubernetes 通过 GPU plugin 实现 GPU 调度支持
- Kubernetes 开启共享 Nvidia GPU 资源配置
前言
Kubernetes 已经成为云原生应用编排和管理的事实标准。在 v1.26 版本 Scheduling GPUs 进入 stable 状态,通过 device plugins 可以让 Pods 可以访问特定硬件如 GPUs。
越来越多的机器学习(ML)和人工智能(AI)领域的开发者希望利用 Kubernetes 平台的优势,来管理 GPU 调度任务。
相比本地 GPU 管理方案,Kubernetes 通过对 GPU 资源的高效分时复用和动态调度,从而降本增效。声明式的容器化配置,使部署过程可以固化和复用,避免了重复配置机器学习环境。同时容器隔离可以避单一进程占用过多共享资源,保障系统稳定性。
尽管本文以 Arch Linux 作为基本环境,但同样适用于其他发行版。
Nvidia 驱动安装
- NVIDIA Driver Installation Quickstart Guide
- 在开始安装 NVIDIA 驱动程序前请参照《 适用于 Linux 的 CUDA 安装指南》中的 2. Pre-installation Actions(预安装操作) 对环境进行预检查。
安装方式
NVIDIA 驱动程序提供三种格式:
推荐使用包管理器 安装驱动,方便以后的维护和升级。
安装示例
以下是在 Arch Linux 上安装 Nvidia 驱动的示例:
Arch Linux Wiki for NVIDIAN 介绍了 Arch Linux 官方提供的 Nvidia 驱动包和内核的对应关系,如下所示:
- nvidia 软件包(用于 linux内核 )
- nvidia-lts 软件包(用于 linux-lts内核 )
- nvidia-dkms 软件包(用于所有其他内核)。
DKMS(Dynamic Kernel Module Support)是一个框架,用于在Linux系统中构建和安装内核模块。它允许在内核更新时自动重建已注册的内核模块。
下面以我的 Arch Linux 环境为例,我日常使用的内核为 linux ,同时也安装了 linux-lts 内核作为备用,我想要 Nvidia 驱动在这俩内核中都正常工作,所以需要安装 nvidia 和 nvidia-lts 命令如下:
# 查看显卡
lspci | grep -i nvidia | grep VGA
# 构建工具
sudo pacman -S --needed base-devel
# nvidia 驱动
sudo pacman -S nvidia nvidia-lts
其他发行版请参考安装方式中提到的 NVIDIA 驱动程序提供三种格式
进行安装。
驱动验证
完成驱动安装好执行 nvidia-smi 验证是否可用
❯ nvidia-smi
Wed Aug 16 17:04:35 2023
+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 535.98 Driver Version: 535.98 CUDA Version: 12.2 |
|-----------------------------------------+----------------------+----------------------+
| GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|=========================================+======================+======================|
| 0 NVIDIA GeForce RTX 3080 ... Off | 00000000:01:00.0 Off | N/A |
| N/A 50C P8 11W / 115W | 8MiB / 16384MiB | 0% Default |
| | | N/A |
+-----------------------------------------+----------------------+----------------------+
+---------------------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=======================================================================================|
| 0 N/A N/A 1067 G /usr/bin/gnome-shell 3MiB |
+---------------------------------------------------------------------------------------+
❯ nvidia-smi --query-gpu=gpu_name --format=csv,noheader
NVIDIA GeForce RTX 3080 Ti Laptop GPU
❯ nvidia-smi -L
GPU 0: NVIDIA GeForce RTX 3080 Ti Laptop GPU (UUID: GPU-1b17e588-c712-9244-37de-93a8a77ebe6d)
上述驱动为单卡配置,其他情况请参考以下文档
- 多卡支持 NVIDIA Multi-Instance GPU User Guide
- 开启 VGPU 支持 VGPU
- 开启消费级显卡的 vgpu 功能 vgpu_unlock
- 更多文档 https://docs.nvidia.com/datacenter/tesla/index.html
CUDA 驱动安装
CUDA(Compute Unified Device Architecture)是 NVIDIA 推出的通用并行计算架构,该架构使 GPU 能够解决复杂的计算问题。